home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / board / Spades.lha / Spades / Source / Bidding.c next >
C/C++ Source or Header  |  1992-02-01  |  4KB  |  173 lines

  1. /*
  2.    FILE: Bidding.c
  3.    PURPOSE: Contains the routines for bidding a hand of Spades
  4.    AUTHOR: Gregory M. Stelmack
  5. */
  6.  
  7. #ifndef GLOBALS_H
  8. #include "Globals.h"
  9. #endif
  10.  
  11. /**********************************************************
  12. * Function: GetBids                                       *
  13. * Parameters: none                                        *
  14. * Return values: none                                     *
  15. * Purpose: Get each player's bid.                         *
  16. **********************************************************/
  17. void GetBids()
  18. {
  19.    int i;
  20.   
  21.    for (i=0 ; i<4 ; i++) Bid[i]=0;  /* Reset bids for each player */
  22.   
  23.    /* Loop through each player */
  24.   
  25.    i=HandLead;
  26.    do
  27.    {
  28.       if (i)
  29.          Bid[i]=CalcBid(i);      /* Computer Player */
  30.       else 
  31.          Bid[i]=GetPlayerBid();  /* Human Player */
  32.       i=(++i)%4;
  33.    }  while (i!=HandLead);
  34.   
  35.    /* Calculate team contracts */
  36.   
  37.    PlayerBid=Bid[0]+Bid[2];
  38.    CompBid=Bid[1]+Bid[3];
  39.   
  40.    /* Pause for click */
  41.  
  42.    SetAPen(RP,YELP);
  43.    Move(RP,200,150);
  44.    Text(RP,"Click mouse",11);
  45.    ReadMouse();
  46.    Move(RP,200,150);
  47.    Text(RP,"           ",11);
  48.        
  49.    /* Erase Bids */
  50.   
  51.    SetBPen(RP,BLUP);
  52.    for (i=0 ; i<4 ; i++)
  53.    {
  54.       Move(RP,MsgX[i],MsgY[i]);
  55.       Text(RP," ",1);
  56.    }
  57. }
  58.  
  59. /**********************************************************
  60. * Function: CalcBid                                       *
  61. * Parameters: player -- number of player to calculate for *
  62. * Return Values: bid -- number of tricks                  *
  63. * Purpose: To calculate the number of tricks bid by a     *
  64. *          player.                                        *
  65. **********************************************************/
  66. int CalcBid(player)
  67. int player;
  68. {
  69.    int i,j,numsuit,points,suit,bid;
  70.    int k,numspades;
  71.         
  72.    points=0;
  73.  
  74.    /* Calculate spades */
  75.   
  76.    numspades=0;
  77.     
  78.    /* Count Spades */
  79.     
  80.    for (j=39 ; j<52 ; j++)
  81.       if (Deck[j]==player+1) numspades++;
  82.  
  83.    numsuit = numspades;
  84.         
  85.    /* Add points for Spades -- if enough to cover, count it */
  86.  
  87.    for (j=51 ; j>38 ; j--)
  88.    {
  89.       k = 12-(j%13);
  90.       if ((Deck[j]==player+1)&&(numsuit>k))
  91.       {
  92.          points+=4;
  93.          numspades=numsuit-k;    /* Used to make sure we don't count tricks
  94.                                     twice for short-suitedness */
  95.       }
  96.    }
  97.  
  98.    /* Add up points for the non-spades suits */
  99.   
  100.    for (i=DIAMONDS ; i<SPADES ; i++)   /* Loop thru suits */
  101.    {
  102.       numsuit=0;
  103.       suit=i*13;
  104.     
  105.       /* Count cards for suit */
  106.     
  107.       for (j=0 ; j<13 ; j++)
  108.          if (Deck[suit+j]==player+1) numsuit++;
  109.                 
  110.       /* Short-Suitedness */
  111.  
  112.       if (numspades>2)
  113.       {
  114.          if (numsuit==0)      points+=8;
  115.          else if (numsuit==1) points+=4;
  116.          else if (numsuit==2) points+=2;
  117.       }
  118.       else if (numspades==2)
  119.       {
  120.          if (numsuit==0)      points+=5;
  121.          else if (numsuit==1) points+=2;
  122.       }
  123.       else if (numspades==1)
  124.       {
  125.          if (numsuit==0)      points+=3;
  126.       }
  127.                 
  128.       /* Add points for face cards */
  129.     
  130.       if (Deck[suit+12]==player+1)    /* Ace   */
  131.       {
  132.          if (numsuit<6)       points+=4;
  133.          else if (numsuit<8)  points+=2;
  134.          else                 points+=1;
  135.       }
  136.       if (Deck[suit+11]==player+1)    /* King  */
  137.       {
  138.          if ((numsuit<5)&&(numsuit>1))       points+=4;
  139.          else if ((numsuit<6)&&(numsuit>1))  points+=2;
  140.          else if ((numsuit<7)&&(numsuit>1))  points+=1;
  141.       }
  142.       if (Deck[suit+10]==player+1)    /* Queen */
  143.       {
  144.          if (numsuit==3) points+=2;
  145.       }
  146.    }
  147.  
  148.    points+=Mode[player];        /* Adjust for aggressiveness */
  149.    if (NilRule==FALSE)          /* If not playing NIL rule, make sure bid
  150.                                    is at least one */
  151.    {
  152.       if (points<4) points = 4;
  153.    }
  154.    bid=points/4;                /* Find Bid */
  155.   
  156.    /* Make sure total team bid not greater than 13 */
  157.   
  158.    i=(player+2)%4;              /* Find partner */
  159.    if ((bid+Bid[i])>13) bid=13-Bid[i];
  160.   
  161.    /* Display Bid */
  162.   
  163.    itoa(bid,String);
  164.    SetAPen(RP,YELP);
  165.    SetBPen(RP,BLUP);
  166.    Move(RP,MsgX[player],MsgY[player]);
  167.    Text(RP,String,strlen(String));
  168.   
  169.    /* Send bid back */
  170.   
  171.    return(bid);
  172. }
  173.